// TODO: 2025/5/25
package Practice;

import java.util.ArrayList;
import java.util.List;

public class Yang_Hui_Triangle {


    public static void main1(String[] args) {
        /*
        1.
        str1: welcome to bit
        str2:come
        删除str1中的出现的所有str2的字符，删除后的结果是wl t bit
        并用list来进行保存
         */
        String str1 = "welcome to bit";
        String str2 = "come";
        ArrayList<Character> arrayList = new ArrayList<>();
        for (int i = 0; i < str1.length(); i++) {
            char ch = str1.charAt(i);
            if (!str2.contains(ch+"")){//返回对象的下标的判断值为假，那么判断为真
                arrayList.add(ch);
            }
        }
        //System.out.println(arrayList);
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.print(arrayList.get(i));
        }
        System.out.println();

        System.out.println("===============");

        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < str1.length(); i++) {
            char ch = str1.charAt(i);
            if (!str2.contains(ch+"")){
                stringBuilder.append(ch);
            }
        }
        System.out.println(stringBuilder);
    }
    //当然如果我们传递到的参数是字符，但是方法应要求你传递字符串的时候，可以去加上"",来表示让其形成字符串

    public static void main2(String[] args) {
        //在写这道题之前，我们先看一下二维顺序表
        List<List<Integer>> list = new ArrayList<>();
        System.out.println(list);
        //那么我们如何往里面赋值呢？
        List<Integer> list1 = new ArrayList<>();
        list1.add(1);
        list1.add(2);
        list.add(list1);//这就是每回往里存的是元素一维数组，就是list<Integer>的元素
        List<Integer> list2 = new ArrayList<>();
        list2.add(11);
        list2.add(21);
        list.add(list2);//这个也是每回传进的是一个一维数组，两个一维数组就是二维数组
        System.out.println(list);

        //二维数组的使用频率是非常高，它的返回值是一般都是List<List<Integer>>这种的
        //后续我们在二叉树中学习的时候，会经常遇到这种
    }


    //118.杨辉三角：
    public static List<List<Integer>> generate(int numRows) {
        List<List<Integer>> ret = new ArrayList<>();

        //对于第一行只有一个元素，我们可以直接进行处理，所以直接进行添加
        List<Integer> list0 = new ArrayList<>();
        list0.add(1);
        ret.add(list0);

        for (int i = 1; i < numRows; i++) {//所以从第二行进行处理
            List<Integer> curRow = new ArrayList<>();
            //首位：
            curRow.add(1);//我们直接把此行首位元素设置为1

            //中间：

            //我们就需要一个来存储前一行的元素
            List<Integer> preRow = ret.get(i-1);//获得前一整行的元素

            for (int j = 1; j < i; j++) {
                //之所以我们小于i，是因为第几行就有几个元素，
                //不能等于i，因为我们把最后一个元素已经置为1,所以不能
                //为什么要从1开始（及第2个元素开始），是因为我们已经把每行元素的首位已经设置好了为1
                //但是我们可以根据这个公式来计算中间的
                //[i][j] = [i-1][j] + [i-1][j-1]
                //我们就要先知道前一行的元素
                int val1 = preRow.get(j);
                int val2 = preRow.get(j-1);
                curRow.add(val1 + val2);
            }

            //尾部：
            curRow.add(1);

            ret.add(curRow);//把一行元素放入到ret动态数组的最后一位置；
        }
        return ret;
    }

    //ret是一个列的动态数组，而每个列中都放了一行cutRow的元素
    public static void main(String[] args) {
        List<List<Integer>> ret = generate(50);
        for (int i = 0; i < ret.size(); i++) {
            for (int j = 0; j < ret.get(i).size(); j++) {
                System.out.print(ret.get(i).get(j) + " ");
            }
            System.out.println();
        }
    }
}
